package cn.ad.server.common.utils;

import java.io.IOException;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;

public class JsonUtils {
	
	private static Logger LOGGER = LoggerFactory.getLogger(JsonUtils.class);
	
	private static ObjectMapper om = new ObjectMapper();

	public static Object toObject(String value, Class<?> c) {
		//om.enableDefaultTyping(DefaultTyping.NON_FINAL, As.PROPERTY);
		try {
			return om.readValue(value, c);
		} catch (JsonParseException e) {
			LOGGER.error(e.getMessage(), e);
		} catch (JsonMappingException e) {
			LOGGER.error(e.getMessage(), e);
		} catch (IOException e) {
			LOGGER.error(e.getMessage(), e);
		}
		return "";
	}

	public static String toJson(Object o) {
		try {
			return om.writeValueAsString(o);
		} catch (JsonProcessingException e) {
			LOGGER.error(e.getMessage(), e);
		}
		return "";
	}
	
	/**
	 * 格式化为json
	 * @param json
	 * @return
	 */
	public static String formatJson(String json){

        StringBuffer result = new StringBuffer();

        int length = json.length();
        int number = 0;
        char key = 0;

        //遍历输入字符串。
        for (int i = 0; i < length; i++)
        {
            //1、获取当前字符。
            key = json.charAt(i);

            //2、如果当前字符是前方括号、前花括号做如下处理：
            if((key == '[') || (key == '{') )
            {
                //（1）如果前面还有字符，并且字符为“：”，打印：换行和缩进字符字符串。
                if((i - 1 > 0) && (json.charAt(i - 1) == ':'))
                {
                    result.append('\n');
                    result.append(indent(number));
                }

                //（2）打印：当前字符。
                result.append(key);

                //（3）前方括号、前花括号，的后面必须换行。打印：换行。
                result.append('\n');

                //（4）每出现一次前方括号、前花括号；缩进次数增加一次。打印：新行缩进。
                number++;
                result.append(indent(number));

                //（5）进行下一次循环。
                continue;
            }

            //3、如果当前字符是后方括号、后花括号做如下处理：
            if((key == ']') || (key == '}') )
            {
                //（1）后方括号、后花括号，的前面必须换行。打印：换行。
                result.append('\n');

                //（2）每出现一次后方括号、后花括号；缩进次数减少一次。打印：缩进。
                number--;
                result.append(indent(number));

                //（3）打印：当前字符。
                result.append(key);

                //（4）如果当前字符后面还有字符，并且字符不为“，”，打印：换行。
                if(((i + 1) < length) && (json.charAt(i + 1) != ','))
                {
                    result.append('\n');
                }

                //（5）继续下一次循环。
                continue;
            }

            //4、如果当前字符是逗号。逗号后面换行，并缩进，不改变缩进次数。
            if((key == ','))
            {
                result.append(key);
                result.append('\n');
                result.append(indent(number));
                continue;
            }

            //5、打印：当前字符。
            result.append(key);
        }
        return result.toString();
    }
	/**
	 * indent
	 * @param number
	 * @return
	 */
    private static String indent(int number){
    	return indent(number, SPACE);
    }
	/**
	 * indent
	 * @param number
	 * @return
	 */
    private static String indent(int number,String tab){
    	StringBuffer result = new StringBuffer();
    	for(int i = 0; i < number; i++)
    	{
    		result.append(tab);
    	}
    	return result.toString();
    }
    
    private static String SPACE = "   ";

}
